/*
TO DO:

*/

#ifndef BOOK_H
#define BOOK_H

#include <string>
#include "LibraryMember.h"

class LibraryMember;

class Book
{
    protected:
        std::string BookID; // azonosito
        std::string Author; // szerzo
        std::string Title; // cim
        std::string Publisher; // kiado
        int Year; // ev
        int Edition; // kiadas
        std::string ISBN; // ISBN
        bool Loanable; // kolcsonozheto-e
        LibraryMember* Loaner; // adott konyvet kolcsonzo tagok
        int LoaningDate; // kolcsonzes ideje
        //std::vector<LibraryMember*> LoaningMembers; //plusz feature lenne
    public:
        Book(std::string Author_init, std::string Title_init, std::string Publisher_init, int Year_init, int Edition_init, std::string ISBN_init); // uj konyv eseten meghivott ctor
        Book(std::string BookID_init, std::string Author_init, std::string Title_init, std::string Publisher_init, int Year_init, int Edition_init, std::string ISBN_init); // betolteskor hivott ctor
        virtual ~Book() {} // dtor

        std::string GenerateID(); // Setter: ID generator
        void SetAuthor(const std::string& Author); // Setter: szerzo
        void SetTitle(const std::string& Title); // Setter: cim
        void SetPublisher(const std::string& Publisher); // Setter: kiado
        void SetYear(const int& Year); // Setter: ev
        void SetEdition(const int& Edition); // Setter: kiadas
        void SetISBN(const std::string& ISBN); // Setter: ISBN
        void SetLoanable(const bool& Loanable); // Setter: kolcsonozhetoseg

        std::string GetBookID() const { return BookID; } // Getter: ID
        std::string GetAuthor() const { return Author; } // Getter: szerzo
        std::string GetTitle() const { return Title; } // Getter: cim
        std::string GetPublisher() const { return Publisher; } // Getter: kiado
        int GetYear() const { return Year; } // Getter: ev
        int GetEdition() const { return Edition; } // Getter: kiadas
        std::string GetISBN() const { return ISBN; } // Getter: ISBN
        bool GetLoanable() const { return Loanable; } // Getter: kolcsonozhetoseg

        void ListBook(); // konyvek listazasa
        bool Loan(LibraryMember* Loaner); // kolcsonzes
        void Return() { Loaner = 0; Loanable = true; } // visszavetel
        bool SearchBook(int mitmit, std::string& szovegszoveg); // kereses
        LibraryMember* GetLoaner() const { return Loaner; } // kolcsonzo szemely kiirasa

        std::string ToLower(std::string mitmit); // nagybetus kisbetusse konvertalo
        friend std::ostream& operator<<(std::ostream& , const Book*); // operator<<
};

#endif // BOOK_H
